package cn.bonoon.kernel.menus;

import java.util.Collection;
import java.util.List;

/**
 * <pre>
 * 用于管理整个框架的子系统及菜单；整个菜单定义的结构如下：
 * <table><tr><td>系统 -> 子系统 -> 频道</td><td> -> 菜单 -> 子菜单</td></tr><tr><td></td><td> -> tabs</td></tr></table>
 * 用户访问菜单定义分两种情况：
 * 1. 超级管理员，即用户身份为超级管理员；则没有限制
 * 2. 一般管理员和普通用户，则需要根据用户的角色进行操作权限的限制
 * </pre>
 * 
 * <pre>
 * 管理整个界面的所有元素的定义等
 * 
 * 包括：菜单、样式、资源
 * </pre>
 * @author jackson
 * @since 3.0
 */
public interface ModuleManager extends StyleGetter{
	
	String CONFIG_USER 		= "user.config.";
	String CONFIG_MANAGER 	= "manager.config.";
	String CONFIG_SUPER 	= "super.config.";
	
	String getId();
	
	String getName();
	
	/** 必须是登录的才可以访问，当进不了子系统的时候，就会跳到这个页面 */
	String getEndpoint();
	
	//---------------------上面与ModuleDefinition一致

	/** 公开的，不需要登录或没有任务访问权限的用户，也可以访问得到的页面 
	 * @deprecated 可能需要被处理*/
	String getDefaultEndpoint();

	/** @deprecated 没有被用到 */
	String targetUrl(String id);

	/** 平台所定义的登录页面的相关信息 */
	LoginPageDefinition loginPage();
	
	/** 返回系统 */
	ModuleDefinition module();
	
	/** 取得所有已经定义的子系统的信息 */
	Collection<ModuleDefinition> modules();

	/** <pre> 根据当前页面访问的信息来对菜单(包括频道)进行查找；
	 * 先根据页面访问解析出来的菜单id进行查找；
	 * 如果菜单id查找不到，则根据访问的路径再进行查找； </pre>*/
	MenuableDefinition find(UrlRequest urlRequest);

	/** 根据菜单的定义层级来加载菜单的信息，返回的结果应该包括tab及tab item的定义 */
	ItemableDefinition find(String mid, String...mids);
	
	/** 根据子系统的ID取得子系统的信息 */
	ModuleDefinition module(String key);

	/** 只有菜单和频道 */
	MenuableDefinition item(String id);
	
	MenuDefinition menu(String id);

	TabsDefinition tab(String id);

	TabItemDefinition tabItem(String id);

	/** 所有定义的tab items */
	Collection<TabItemDefinition> tabItems();
	
	/** 系统定义的个人中心的频道 */
	ChannelDefinition personalCenter();
	
	ChannelDefinition getChannelManager();
	
	MenuViewBuilder menuBuilder(MenuCheckable menuCheckable, boolean only, String... key);
	
	/** 静态资源的解析器 */
	ServerResourceResolver getResourceServer();
	
	List<VersionDefinition> getVersions();

	DescribeDefinition describe(String id);
	
//	ShortcutDefinition shortcut(String id);
}
